package pe.edu.unmsm.fisi.ceups.modelo.dao.hibernate;

import java.io.Serializable;
import java.util.List;
import org.hibernate.Session;
import pe.edu.unmsm.fisi.ceups.modelo.dao.GenericoDAO;

public class HibernateDAO<Entidad> implements GenericoDAO<Entidad>  {
    
    private Session session;
    private Class<Entidad> entidad;
    
    public HibernateDAO(Class<Entidad> entidad, Session session) {
        this.session = session;
        this.entidad = entidad;
    }

    public List<Entidad> findAll(String order) {        
        String query = "from " + entidad.getName() + " as entidad";
        return (List<Entidad>) session.createQuery(query + order).list();
    }
    /*
     public List<Entidad> findAll() {        
        String query = "from " + entidad.getName();
        return (List<Entidad>) session.createQuery(query).list();
    }*/
    
    public List<Entidad> findByProperty(String property, Object value, String operator, String order) {        
        String query = "from " + entidad.getName() + " as entidad where entidad." + 
                property + " " + operator + " " + value;
        return (List<Entidad>) session.createQuery(query + order).list();
    }
/*
     public List<Entidad> findByProperty(String property, Object value, String operator) {        
        String query = "from " + entidad.getName() + " as entidad where entidad." + 
                property + " " + operator + " " + value;
        return (List<Entidad>) session.createQuery(query).list();
    }*/
    
    public List<Entidad> findByProperties(String[] properties, Object[] values, String order) {
        String query = "from " + entidad.getName() + " as entidad where ";
        for(int i = 0; i < properties.length; i++) {
            if (values[i] instanceof String) {
                values[i] = "'" + values[i] + "'";
            }
            query = query + "entidad." + properties[i] + " = " + values[i];
            if (i != (properties.length - 1)) {
                query = query + " and ";
            }
        }       
        return (List<Entidad>) session.createQuery(query + order).list();
    }
    
    public void saveOrUpdate(Object object) {
        session.saveOrUpdate(entidad.getName(), object);
    }

    public void delete(Object object) {
        session.delete(entidad.getName(), object);        
    }

    public Object findById(Serializable serializable) {
        return session.get(entidad.getName(), serializable);
    }
    
}
